﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using BatallaNavalgo;

namespace InterfazGrafica
{
  
    public class Controlador
    {
        private Vista vista;
        private Tablero tablero;
        private Jugador jugador;
        private CasillaGrafica[,] casilleros;
        private int disparoActual;

        public Controlador(Vista vista,int x, int y , int anchoCuadricula)
        {
            this.vista = vista;
            this.tablero = new Tablero();
            this.jugador = new Jugador(this.tablero);
            this.CrearCasillas(x, y, anchoCuadricula);
        }

        private void CrearCasillas(int x, int y, int anchoCuadricula)
        {
            this.casilleros = new CasillaGrafica[10, 10];
            for (int i = 0; i < 10; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    Rectangle rect = new Rectangle(x, y, anchoCuadricula, anchoCuadricula);
                    Casilla casilla = this.tablero.GetCasilla(new Tuple<int, int>(i, j));
                    CasillaGrafica casillero = new CasillaGrafica(rect, casilla);
                    casilleros[i, j] = casillero;
                    x += anchoCuadricula + 1;
                }
                x = 0;
                y += anchoCuadricula + 1;
            }
        }

        public bool button1_Click()
        {
            if (this.vista.Button1.Text == "INICIAR JUEGO")
            {
                this.tablero = new Tablero();
                this.jugador = new Jugador(this.tablero);
                this.CrearCasillas(0, 0, 40);
                this.vista.Button1.Text ="ALMACENAR DISPARO/MINA";
                this.vista.Label1.Text = "PUNTAJE ACTUAL:\n" + jugador.Puntaje.ToString();
                return true;
            }
            else if (this.vista.Button1.Text == "ALMACENAR DISPARO/MINA")
            {
                this.vista.HabilitarOpcionesDeDisparo();
                this.vista.Button1.Text = "SELECCIONE EL DISPARO/MINA";
                return false;
            }
            return false;
        }

        public Tuple<int,int> pictureBox1_Click(MouseEventArgs e)
        {
            Point pt = new Point(e.X, e.Y);
            for (int i = 0; i < 10; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    if (this.casilleros[i, j].InteractuóConElCursor(pt))
                    {
                        Tuple<int, int> posicion = new Tuple<int, int>(i, j);
                        switch (disparoActual)
                        {
                            case 1: this.jugador.ColocarDisparo(new DisparoConvencional(0), posicion);
                                break;
                            case 2: this.jugador.ColocarDisparo(new MinaPuntual(2), posicion);
                                break;
                            case 3: this.jugador.ColocarDisparo(new MinaDoble(2), posicion);
                                break;
                            case 4: this.jugador.ColocarDisparo(new MinaTriple(2), posicion);
                                break;
                            case 5: this.jugador.ColocarDisparo(new MinaPorContacto(0), posicion);
                                break;
                        }
                        return posicion;
                    }
                }
            }
            return null;
        }

        public void RealizarTurno(Object sender, EventArgs e,Tuple<int,int> posicion_inicial)
        {
            this.vista.Label1.Text = "PUNTAJE ACTUAL:\n" + jugador.Puntaje.ToString();
            this.jugador.JugarTurno();
            this.vista.DibujarTablero(sender, e,false,posicion_inicial);
            this.jugador.PasarTurno();
            this.vista.Label1.Text = "PUNTAJE ACTUAL:\n" + jugador.Puntaje.ToString();
            this.vista.DibujarTablero(sender, e,false,posicion_inicial);
            this.vista.DibujarTablero(sender, e, true,posicion_inicial);
            
            if (this.tablero.EstaVacio())
            {
                this.vista.DeshabilitarButton2();
                if (MessageBox.Show("TU PUNTAJE ES: " + this.jugador.Puntaje.ToString() + "\nPRESIONE ACEPTAR PARA INICIAR UN NUEVO JUEGO", "PARTIDA FINALIZADA", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) == DialogResult.OK)
                {
                    this.vista.Button1.Text = "INICIAR JUEGO";
                    this.vista.HacerClickEnButton1(sender, e);
                }
                else Application.Exit();
            }
            else this.vista.Button1.Text = "ALMACENAR DISPARO/MINA";
            this.vista.Button1.Enabled = true;
            this.vista.Button1.Visible = true;
        }

        public void pictureBox1_Paint(object sender, EventArgs e, bool boolean,Tuple<int,int> posicion_inicial)
        {
            if (boolean == false)
            {
                Rectangle rect = this.casilleros[posicion_inicial.Item1, posicion_inicial.Item2].Rect;
                if (this.tablero.GetCasilla(posicion_inicial).TieneDisparoParaImpactar())
                    this.vista.Explotar(rect);
                else if (this.tablero.GetCasilla(posicion_inicial).TieneDisparo())
                    this.vista.RellenarCuadro(Color.Green, rect);
                for (int i = 0; i < 10; i++)
                {
                    for (int j = 0; j < 10; j++)
                    {
                        if (posicion_inicial.Item1 != i | posicion_inicial.Item2 != j)
                        {
                            Tuple<int, int> posicion = new Tuple<int, int>(i, j);
                            rect = this.casilleros[i, j].Rect;
                            if (this.tablero.GetCasilla(posicion).TieneDisparoParaImpactar())
                                this.vista.Explotar(rect);
                            else if (this.tablero.GetCasilla(posicion).TieneDisparo())
                                this.vista.RellenarCuadro(Color.Green, rect);
                        }
                    }
                }
            }
            else
            {
                for (int i = 0; i < 10; i++)
                {
                    for (int j = 0; j < 10; j++)
                    {
                        Tuple<int, int> posicion = new Tuple<int, int>(i, j);
                        Rectangle rect = this.casilleros[i, j].Rect;
                        if (this.tablero.GetCasilla(posicion).TieneDisparo())
                            this.vista.RellenarCuadro(Color.Green, rect);
                        else
                            this.vista.RellenarCuadro(Color.Blue, rect);
                        this.vista.DibujarCuadro(rect);
                        FragmentoDeNave fragmento = this.tablero.GetFragmentoDeNave(new int[2] { i, j });
                        if (fragmento != null)
                        {
                            if (fragmento.EstaDestruido())
                                this.vista.RellenarCuadro(Color.Black, rect);
                            this.vista.CargarBarco(fragmento.Nave.GetCodigo(), rect);
                        }  
                    }
                }
            }
        }

        public void RadioButton_CheckedChanged(int numero)
        {
            this.disparoActual = numero;
        }

        



    }


}
